# -*- coding: utf-8 -*-
"""
用户认证后端 - 支持多种登录方式
"""

from django.contrib.auth.backends import ModelBackend
from django.db.models import Q
from .models import User


class MultipleLoginBackend(ModelBackend):
    """
    自定义认证后端，支持以下方式登录：
    1. 用户名 + 密码
    2. 手机号 + 密码
    3. 邮箱 + 密码
    """
    
    def authenticate(self, request, username=None, password=None, **kwargs):
        """
        重写认证方法，支持多种登录方式
        
        Args:
            request: HTTP请求对象
            username: 用户名/手机号/邮箱
            password: 密码
            **kwargs: 其他参数
            
        Returns:
            User对象或None
        """
        try:
            # 尝试使用用户名、手机号或邮箱查找用户
            user = User.objects.get(
                Q(username=username) | 
                Q(phone=username) | 
                Q(email=username)
            )
            
            # 验证密码
            if user.check_password(password):
                return user
            
        except User.DoesNotExist:
            # 用户不存在
            return None
        except User.MultipleObjectsReturned:
            # 如果查询返回多个用户，使用用户名精确匹配
            try:
                user = User.objects.get(username=username)
                if user.check_password(password):
                    return user
            except User.DoesNotExist:
                return None
        
        return None
    
    def get_user(self, user_id):
        """
        根据用户ID获取用户对象
        
        Args:
            user_id: 用户ID
            
        Returns:
            User对象或None
        """
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None
